package com.ma.a11;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ClassName CglibProxyDemo
 * @Author: mayongqiang
 * @DATE 2022/4/7 23:25
 * @Description: Cglib代理实现
 */

public class CglibProxyDemo {
    public static void main(String[] args) {
        Target target = new Target();
        Target proxy = (Target) Enhancer.create(Target.class, (MethodInterceptor) (p, method, args1, methodProxy) -> {
            System.out.println("before");
            //反射
            //Object result = method.invoke(target, args1);
            /*
             * methodProxy.invoke(target, args);
             * 内部没有反射！！！！ 需要目标  spring用的这种！
             */
            //Object result = methodProxy.invoke(target, args);

            /*
             * 内部没有反射，需要代理
             */
            Object result = methodProxy.invokeSuper(p, args1);
            System.out.println("after");
            return result;
        });
        proxy.foo();
    }

    /*
     * cglib 不要求目标实现接口，它生成的代理类是目标的子类，因此代理与目标之间是子父关系
     * 限制：根据上述分析 final 类无法被 cglib 增强
     */
    static class Target {
        public void foo() {
            System.out.println("target foo");
        }
    }
}
